#include<stdio.h>

//数组指针
void PrintArray(int (*a)[3],int size)     //二维数组当参数传递，丢失的是一维数组的个数，每个一维数组里所有的元素不丢失
{
    for(int i=0;i<size;i++)   //外循环控制行数
    {
        for(int j=0;j<3;j++)   //内循环控制列数
            printf("%d ",a[i][j]);  //
        printf("\n");
    }

}

int main()
{
    //二维数组：多个一维数组的集合
    int a[2][3] =  //定义两个一维数组
    {
        {1,2,3},
        {4,5,6}
    };

    //PrintArray(a,2);
    // for(int i=0;i<2;i++)   //外循环控制行数
    // {
    //     for(int j=0;j<3;j++)   //内循环控制列数
    //     printf("%p ",&a[i][j]);  //
    //     printf("\n");
    // }

    // a : 数组指针，指向二维数组的第一个一维数组
    // a[0] : 元素指针：指向第一个一维数组的第一个元素
    // a[0] = &a[0][0]
    // &a : 二维数组指针，走一步跨一个二维数组
    printf("%p %p %p %p\n",a,a[0],&a[0][0],&a);
    printf("%p %p %p %p\n",a+1,a[0]+1,&a[0][0]+1,&a+1);

    printf("%d\n",**a);  // 1
    printf("%d\n",**(a+1));  // 4
    printf("%d\n",*(*a+1));  // 2

    // a[i] = *(a+i)
    printf("%d\n",*(a[0]));  // 1
    printf("%d\n",*(a[1]));  // 4
    printf("%d\n",*(a[1]+1));  // 5
    printf("%d\n",**(&a[0]+1));  // 4

    //  a[i][j] = * (* (a + i ) + j ) 恒成立
    printf("%d\n",a[1][1]); // 5
    printf("%d\n",*(*(a+1)+1)); // 5



    int (*p)[3] = a;
    printf("%d\n",**(p+1));  // 4

    int (*p)[2] = a;
    printf("%d\n",**(p+1));  // 3
    return 0;
}